﻿/** 装甲勇士整合脚本(UTF-8 with BOM)
  用于一键出招,一键秘籍,涡轮飞行
  WinKawaks模拟器的暂停,静音切换,有确认的即时存档读档
  游聚平台连发,静音切换,热键中断切换
  
  By setycyas @20xx-11-15
*/

/** 全局设定 
*/ { ;不缩进块
#NoEnv
#Warn
SendMode Input
SetWorkingDir %A_ScriptDir%
} ;不缩进块

/** 调用库
*/ { ;不缩进块
#Include ..\MyAhkModules\MyKey2.ahk ;按键相关库,所有函数导出到MyKey对象中
#Include ..\MyAhkModules\MyWinkawaks.ahk ;导入自定义的Winkawaks通用快捷键,用MyWinKawaks_setHotkeys()函数设置
#Include ..\MyAhkModules\MyXZone.ahk ;导入自定义的游聚平台通用快捷键,用MyXZone_setHotkeys()函数设置
} ;不缩进块

/** 全局变量
*/ { ;不缩进块
  
/* 枚举量,全体大写
*/
;武器名称枚举量
global D_DRILL := "D DRILL", F_CLAW := "F CLAW", C_SPARK := "C SPARK", L_BLADE := "L BLADE" ;手部武器枚举量
global FLAME := "FLAME", LASER := "LASER", BOMB := "BOMB", MISSILE := "MISSILE" ;肩部武器枚举量

/* 常量,全体大写
*/
global GAME_NAME := "装甲勇士" ;用于在Gui中显示游戏名字
global KEY_A := "d", KEY_B := "e", KEY_C := "s"  ;按键设置

;秘籍指令表,用于每一关之前的武器选择秘籍
global CHEAT_TABLE := {} 
CHEAT_TABLE[D_DRILL] := ["up", KEY_B, KEY_C]
CHEAT_TABLE[F_CLAW] := ["right", KEY_B, KEY_C]
CHEAT_TABLE[C_SPARK] := ["down", KEY_B, KEY_C]
CHEAT_TABLE[L_BLADE] := ["left", KEY_B, KEY_C]
CHEAT_TABLE[FLAME] := ["left", "down", KEY_B, KEY_C]
CHEAT_TABLE[LASER] := ["right", "down", KEY_B, KEY_C]
CHEAT_TABLE[BOMB] := ["left", "up", KEY_B, KEY_C]
CHEAT_TABLE[MISSILE] := ["right", "up", KEY_B, KEY_C]

;设定常用武器表,用于一键设定秘籍
global FAV_WEAPONS := [D_DRILL, L_BLADE, FLAME, LASER]

/* 变量
*/
global exeTitle := "" ;接收游戏平台选择
global sbText := "" ;状态栏文本,也用于状态栏引用
global delay1 := 100 ;技能延时1
global delay2 := 200 ;技能延时2
global flyDelay := 3000 ;涡轮跳跃飞行时间
global cheatWeapon := D_DRILL ;当前秘籍武器

} ;不缩进块

/** 自定义函数,除Gui响应和热键绑定专用函数以外
*/ { ;不缩进块
  
/* 缩短MyKey模块的函数名称
*/
press(key, pressDuration := 100){ 
  return MyKey.press(key, pressDuration)
}
pressKeys(keys, delays, duration := 50){
  return MyKey.pressKeys(keys, delays, duration)
}
waitKeyUp(key, waitTime, waitDuration := 100){
  return MyKey.waitKeyUp(key, waitTime, waitDuration)
}

/* 系统相关操作 
*/
;静音切换
muteToggle(){
  SoundSet, +1, , Mute
}

/* 游戏技能操作函数 
*/
;技能1,按住A键后迅速按方向键
;参数key为技能按键,用于等待按键放手时再松开A键
;参数direction为方向键,应该是字符串up,down,left,right之一 
skill1(key, direction){
  send, {%KEY_A% down}
  sleep, %delay1%
  send, {%direction% down}
  sleep, %delay2%
  send, {%direction% up}
  ;等待key松开再发送A键松开
  while (GetKeyState(key)) {
    sleep, 20
  }
  send, {%KEY_A% up}
}

;涡轮飞行 
fly(){
  send, {%KEY_B% down}
  sleep, %flyDelay%
  send, {%KEY_B% up}
}

;秘籍1,每关开头按住方向键+BC选择武器
cheat1(key){
  local i, v, k
  for i, v in CHEAT_TABLE[cheatWeapon] {
    k := CHEAT_TABLE[cheatWeapon][i]
    send, {%k% down}
    ;sleep, 20
  }
  ;等待key松开再发送A键松开
  while (GetKeyState(key)) {
    sleep, 50
  }
  for i, v in CHEAT_TABLE[cheatWeapon] {
    k := CHEAT_TABLE[cheatWeapon][i]
    send, {%k% up}
    ;sleep, 20
  }
}

;从FAV_WEAPONS中快速选择秘籍武器,如果当前武器是FAV_WEAPONS中的武器,则选择下一件,否则选择第一件FAV_WEAPON
selectFav(){
  local isSelected := 0 ;是否已经选择武器
  ;遍历,看看当前选择武器是否在FAV_WEAPONS中,如果在则选择下一件并标记isSelected
  local i, v
  For i, v in FAV_WEAPONS {
    if (cheatWeapon == v) {
      if (i == FAV_WEAPONS.Count()) {
        cheatWeapon := FAV_WEAPONS[1]
      } else {
        cheatWeapon := FAV_WEAPONS[i+1]
      }
      isSelected := 1
      break
    }
  }
  ;如果还没选择武器,则选择第一件FAV_WEAPONS
  if (!isSelected) {
    cheatWeapon := FAV_WEAPONS[1]
  }
  refreshSB()
}

/* 刷新状态栏,显示当前数据
*/
refreshSB(){
  GuiControl, MainUI:Text, sbText, %cheatWeapon%
}


} ;不缩进块

/* 设置Gui的函数 
*/ { ; 不缩进块

;选择游戏平台的UI
selectionUI(){
  Gui, New, , 选择游戏平台
  Gui, add, ListBox, vexeTitle Choose1, WinKawaks.exe|X-Zone.exe
  Gui, add, Button, gButtonTitleSelect, 选择游戏平台
  Gui, show
}    

;设置游戏的主要UI,title是平台的exe标题,目前是WinKawaks.exe|X-Zone.exe二选一
setupUI(title) {
  ;Gui, MainUI:New, , %GAME_NAME% - %title%
  Gui, MainUI:New, , % SubStr(title, 1, 1) . GAME_NAME
  Gui, Add, Text, , 秘籍武器选择:
  Gui, Add, ComboBox, XP+100 W80 VcheatWeapon Choose1, %D_DRILL%|%F_CLAW%|%C_SPARK%|%L_BLADE%|%FLAME%|%LASER%|%BOMB%|%MISSILE%
  Gui, Add, Button, XP-100 YP+25 gButtonSubmit_, 提交 ;提交,运行ButtonSubmit_()函数
  Gui, Add, Button, xp+120 gButtonExit, 退出 ;结束app
  Gui, Add, StatusBar, vsbText ;状态栏并非默认,更新文本必须用:GuiControl, MainUI:Text, sbText, 新文本 
  refreshSB()
  Gui, MainUI:+AlwaysOnTop
  Gui, MainUI:Show, X1085 Y250
}

} ;不缩进块

/* Gui响应函数
*/ { ;不缩进块

ButtonSubmit_(){
  Gui, Submit, NoHide ; 保存用户输入后每个控件的数据,NoHide可以在提交数据后保持窗体显示
  refreshSB()
  MsgBox, You have submit your changes!
}

ButtonExit(){
  ExitApp
}

;只能用在不设定名字的Gui,所以两个Gui只有一个生效,我选择了让启动时的那个生效
GuiClose(){
  ExitApp
}

;选择游戏平台后的操作
ButtonTitleSelect(){
  Gui, Submit, Hide
  setupUI(exeTitle)
  setupHotkeys(exeTitle)
}

} ;不缩进块

/* 快捷键响应函数
*/ { ;不缩进块

;w键连发KEY_A
KeyW(){
  while (GetKeyState("w")) {
    press(KEY_A, 20)
    sleep, 20
  }
}

;q,r,2分别是左右上技能
KeyQ(){
  skill1("q", "left")
}
KeyR(){
  skill1("r", "right")
}
Key2(){
  skill1("2", "up")
}

;x键秘籍
KeyX(){
  cheat1("x")
}

} ;不缩进块

/* 根据游戏平台设置快捷键的函数 
*/ { ;不缩进块
setupHotkeys(title){
  local wTitle := "ahk_exe " . title
  if (wTitle == "ahk_exe WinKawaks.exe") { ;模拟器WinKawaks
    MyWinKawaks_setHotkeys() ;WinKawaks通用热键
    Hotkey, IfWinActive, %wTitle%
    ;这里设置模拟器WinKawaks热键
    Hotkey, ~q, KeyQ
    Hotkey, ~r, KeyR
    Hotkey, ~2, Key2
    Hotkey, ~3, fly
    Hotkey, ~x, KeyX
    Hotkey, ~RControl, selectFav
    Hotkey, IfWinActive
  } else if (wTitle == "ahk_exe X-Zone.exe") { ;游聚平台
    MyXZone_setHotkeys("d", "w", +1) ;游聚平台通用热键
    Hotkey, IfWinActive, %wTitle%
    ;这里设置游聚平台热键
    Hotkey, ~q, KeyQ
    Hotkey, ~r, KeyR
    Hotkey, ~2, Key2
    Hotkey, ~3, fly
    Hotkey, ~x, KeyX
    Hotkey, ~RControl, selectFav
    Hotkey, IfWinActive
  }

}

} ;不缩进块

/* 主函数,这里是只显示选择平台的UI,之后交给选择后的函数去处理
*/ { ;不缩进块
main() {
  ;设置游戏平台选择UI
  selectionUI()
}
} ;不缩进块

/* 运行脚本 
*/
main()
return
